<?php

Loader::using("ext::libs::MicrosoftDateFormatter");
Loader::using("models::entities::Inscritos");
Loader::using("models::entities::Entrevistas");
Loader::using("models::entities::Personas");
Loader::using("models::entities::DatosContacto");
Loader::using("models::entities::HistorialLaboral");
Loader::using("models::entities::Interesados");
Loader::using("models::entities::Identificacion");
Loader::using("models::entities::enums::TipoInscripcion");
Loader::using("ext::libs::EmailsFactory");
Loader::using("ext::libs::createFDF");

/**
 * Description of ActualizarDatos
 * 
 * @author ETorres
 * @export Modules
 * @export-metadata default-module
 */
class Inscripciones extends Module {
    
    public function index() {
        $this->loadPersonalData();
        $this->loadCarrers();
        $this->loadBarrios();
        $hayCedula = false;
        $existeGeneral = false;
        $existeFamiliar = false;
        $existeEstudio = false;
        $existeLaboral = false;
        $existeInteres = false;
        $cedula = $this->request->get("Cedula");
        $terminado = false;

        if ($cedula) {
            $hayCedula = true;

            $this->assign("cedulaInscrito", $cedula);
            
            $inscrito = $this->buscarInscrito($cedula);
            
            if($inscrito != NULL){
                $this->route->redirect($this->route->action("candidate"));
            }
        }

        $this->assign("hayCedula", $hayCedula);
        $this->assign("terminado", $terminado);
        $this->assign("continuar", $this->route->action("index"));

        $this->display("index");
    }
    
    private function buscarInscrito($cedula) {
        $periodoActual = ModulesContext::instance()->getConfig()->get("periodoInscripcion");
        
        $periodoInscripcion = new PeriodoAcademico();
        $periodoInscripcion->setAno($periodoActual["ano"]);
        $periodoInscripcion->setPeriodo($periodoActual["periodo"]);

        $identificationObject = new Identificacion();

        $identificationObject->setNumeroDocumentoIdentidad($cedula);

        return $this->model->interested->GetByIdentificacionAndPeriodoAcademico($identificationObject, $periodoInscripcion);
    }


    public function candidate() {
        $cedula = $this->request->get("Cedula");
        
        $inscrito = $this->buscarInscrito($cedula);
        $tipoDocumentoIdentidad = Identificacion::getTipo($inscrito->getInteresadoPk()->getIdentificacion()->getTipoDocumentoIdentidad());
        $documentoIdentidad = $inscrito->getInteresadoPk()->getIdentificacion()->getNumeroDocumentoIdentidad();
        $planEstudio = $this->model->career->GetById($inscrito->getInteresadoPk()->getCodigoPlanEstudio());
        $nombreCompleto = $inscrito->getNombres() . ' ' . $inscrito->getApellidos();
        
        $this->assign("credencial", $this->route->action("credencial") . '&ajax=1&idEstudiante=' . $cedula);
        $this->assign("tipoDocumentoIdentidad", $tipoDocumentoIdentidad);
        $this->assign("documentoIdentidad", $documentoIdentidad);
        $this->assign("planEstudio", $planEstudio);
        $this->assign("nombreCompleto", $nombreCompleto);
        $this->assign("inscrito", $inscrito);
        
        $this->display();
    }

    public function Save() {
        if ($this->request->submitted()) {
            /* @var $inscrito Inscritos */


            $estudianteNuevo = $this->request->post("estudianteNuevo");

            $estudiante = $this->model->admisiones->GetById($estudianteNuevo['DocumentoIdentidad']);

            $laboralesBorrados = $this->request->post("deletedLaboralHistory");
            $estudiosBorrados = $this->request->post("deletedUniversities");

            if (empty($estudiante)) {
                $this->model->admisiones->Create($estudianteNuevo);
            } else {
                $this->model->admisiones->Update($estudianteNuevo);
            }

            if ($estudianteNuevo["terminado"]) {
                $this->setComprobante($estudianteNuevo["DocumentoIdentidad"]);
            }

            if (!empty($laboralesBorrados)) {
                $codigos = explode("_", $laboralesBorrados);
                foreach ($codigos as $codigo) {
                    $this->model->admisiones->EliminarReferenciaLaboral($codigo);
                }
            }


            if (!empty($estudiosBorrados)) {
                $codigos = explode("_", $estudiosBorrados);
                foreach ($codigos as $codigo) {
                    $this->model->admisiones->EliminarEstudio($codigo);
                }
            }

            $this->addMessage(new Message("Su Inscripci&oacute;n ha sido recibida exitosamente.", "", Message::SUCCESS));

            $this->assign("terminado", $this->model->admisiones->Terminado($estudianteNuevo['DocumentoIdentidad']));
            
            $this->route->redirect($this->route->action("candidate"));
            
            $this->display();
        } else {
            $this->index();
        }
    }

    public function noHayCredencial() {

        $this->addMessage(new Message("En el momento no hay entrevistas para el programa al que aspira, comuniquese con la Universidad. Gracias!", "", Message::SUCCESS));
        $this->assign("return", $this->route->action("index"));

        $this->display();
    }

    public function credencial() {

        $identificacion = $this->request->get("idEstudiante");
        
        $inscrito = $this->buscarInscrito($identificacion);
        
        $periodoActual = ModulesContext::instance()->getConfig()->get("periodoInscripcion");
        
        $periodoInscripcion = new PeriodoAcademico();
        $periodoInscripcion->setAno($periodoActual["ano"]);
        $periodoInscripcion->setPeriodo($periodoActual["periodo"]);
        
        $planEstudio = $inscrito->getInteresadoPk()->getCodigoPlanEstudio();

        $carrera = $this->model->career->GetById($planEstudio);

        $isAsignado = $this->model->interviews->GetByInscrito($periodoInscripcion, $identificacion, $planEstudio);

        $entrevista = new Entrevistas();
        
        if (empty($isAsignado)) {
            $entrevista = $this->model->interviews->GetHabilitados($periodoInscripcion, $planEstudio);

            if ($entrevista == null) {
                $this->route->redirect($this->route->action("noHayCredencial") . "&ajax=0");
            } else {
                $this->model->interviews->Reservar($entrevista->getEntrevistaPk(), $identificacion);
                //$this->model->interviews->Create($identificacion, $entrevista->getEntrevistaPk()->getLugarEntrevista(), $entrevista->getEntrevistaPk()->getHorario());
            }
        } else {
            $entrevista = $isAsignado;
        }

        if ($planEstudio == "310") {            
            $pruebaPsicotecnica = $this->model->interviews->GetPruebas($periodoInscripcion, $planEstudio, $entrevista->getEntrevistaPk()->getHorario());
            
            $hayPrueba = false;                             
                        
            if (!is_null($pruebaPsicotecnica)) {
                //$fechaInicio = intval($pruebaPsicotecnica->getHoraInicio() / 60) . ':' . ($pruebaPsicotecnica->getHoraInicio() % 60);
                //$fechaFin = intval($pruebaPsicotecnica->getHorarioFin() / 60) . ':' . ($pruebaPsicotecnica->getHorarioFin() % 60);
                
                //$fechaInicio = new DateTime($fechaInicio);
                //$fechaFin = new DateTime($fechaFin);

                $hayPrueba = true;
                
                //Esto es para el calculo de la Hora de la Entrevista.!
                $split = explode(".", $pruebaPsicotecnica->getHora() / 60);
                $horaEntrevista = date("g:i a", strtotime($split[0] . ":" . fmod($pruebaPsicotecnica->getHora() , 60)));
                
                //$this->assign("fechaInicio", $fechaInicio);
                //$this->assign("fechaFin", $fechaFin);
                $this->assign("pruebaPsicotecnica", $pruebaPsicotecnica);
                $this->assign("horaEntrevista", $horaEntrevista);
            }

            $this->assign("hayPrueba", $hayPrueba);
        }

        $this->assign("entrevista", $entrevista);
        $this->assign("carrera", $carrera);
        $this->assign("fechaActual", date("d/m/Y"));
        $this->assign("interesado", $inscrito);

        $this->sendMail($inscrito);

        $this->display("credencial");
    }

    private function loadPersonalData() {
        $this->assign("estadosCiviles", Asociados::$EstadosCiviles);
        $this->assign("tiposDocumentos", Identificacion::TiposDocumentos());
        $this->assign("estratos", array("1", "2", "3", "4", "5", "6",));
        $this->assign("tiposDeSangre", TipoSangre::$nombresGrupos);
        $this->assign("RHs", array("+", "-"));

        $isEgresado = $this->request->get("NoFrame", 0);
        $this->assign("action", $this->route->action("Save", array("NoFrame" => $isEgresado,)));

        $this->assign("viewLaboral", $this->route->moduleAction("InformacionLaboral", "ShowInformacionLaboral"));
        $this->assign("viewAcademico", $this->route->moduleAction("InformacionAcademica", "ShowInformacionAcademica"));
        $this->assign("viewIdiomas", $this->route->moduleAction("InformacionIdiomas", "ShowInformacionIdiomas"));

        $this->assign("Paises", $this->model->countries->GetAll(false));
    }

    private function loadBarrios() {
        $this->assign("Barrios", $this->model->admisiones->GetBarrios());
    }

    private function loadCarrers() {
        $periodoJSON = ModulesContext::instance()->getConfig()->get("periodoInscripcion");
        
        $periodoInscripciones = new PeriodoAcademico();
        $periodoInscripciones->setAno($periodoJSON["ano"]);
        $periodoInscripciones->setPeriodo($periodoJSON["periodo"]);
        
        $Carreras = $this->model->career->GetByPeriodoAcademico($periodoInscripciones);
        
        $this->assign("Carreras", $Carreras);
    }

    private function sendMail($interesado) {

        $remitente = 'info@usbctg.edu.co';

        $emails = array();

        //array_push($emails, "etorres@usbctg.edu.co");
        array_push($emails, $interesado->getEmail());
        array_push($emails, "tzuniga@usbctg.edu.co");

        $params = array();

        /* @var $planEstudio PlanesEstudios */
        $planEstudio = $this->model->career->getById($interesado->getInteresadoPk()->getCodigoPlanEstudio());

        /*
         * Formato de correo para estudiantes nuevos
         * 
         * {0} Nombre
         * {1} Apellido
         * {2} Tipo Id
         * {3} No. ID
         * {4} Programa
         * 
         */
        
        array_push($params, $interesado->getNombres());
        array_push($params, $interesado->getApellidos());
        array_push($params, "");
        array_push($params, $interesado->getInteresadoPk()->getIdentificacion()->getNumeroDocumentoIdentidad());
        array_push($params, $planEstudio->getNombrePlan());

        EmailsFactory::SendMail(1, $emails, $params, $remitente);
    }

    public function gost() {
        
//        $identificacion = new Identificacion();
//        
//        $identificacion->setNumeroDocumentoIdentidad("111");
        
        $periodo = new PeriodoAcademico();
        
        $periodo->setAno("2013");
        $periodo->setPeriodo("1");
        
        $habilitados = $this->model->interviews->GetHabilitados($periodo, '996');
        
        var_dump($habilitados);
        die;
        
//        $interesado = $this->model->interested->GetByIdentificacionAndPeriodoAcademico($identificacion, $periodo);
//        
//        echo "<br/><br/>";
//        
//        var_dump($interesado->getNombres());
//        var_dump($interesado->getApellidos());
//        var_dump(Identificacion::getTipo($interesado->getInteresadoPk()->getIdentificacion()->getTipoDocumentoIdentidad()));
//        var_dump($interesado->getInteresadoPk()->getIdentificacion()->getNumeroDocumentoIdentidad());
//        var_dump(TipoInscripcion::getTipoInscripcion($interesado->getTipoInscripcion()));
//        var_dump($interesado->getInteresadoPk()->getCodigoPlanEstudio());
//        var_dump($interesado->getEmail());
//        
//        
//        
//        die;
        
        $this->display("gost");
    }
    
    private function generateAllPDF() {
        
        $inscritos = $this->model->admisiones->GetAll();
         
        
        $ruta = "components/com_acaweb/files/";
        
        $pdf_file = $ruta . 'FormularioInscripcion.pdf';
        

        if(isset($inscritos)){
            
            foreach ($inscritos as $inscrito){
                
                $cedula = $inscrito["DocumentoIdentidad"];

                $fdf_file = $ruta . '/FormulariosDiligenciados/' . $cedula . '.fdf';

                $fdf = createFDF($pdf_file, $inscrito);
                
                if ($fp = fopen($fdf_file, 'w')) {
                    fwrite($fp, $fdf, strlen($fdf));
                } else {
                    echo 'No se pudo crear el archivo: ' . $fdf_file . '<br><br>';
                }
                fclose($fp);

                $path = $ruta . '/FormulariosDiligenciados/' . $cedula . '.pdf';
                
                
                /*
                 * Esta linea es la que unifica el formulario PDF con el archivo .fdf.
                 * Para que funcione, es necesario instalar en complemento del sistema operativo pdftk,
                 * la ruta /usr/local/bin/pdftk se utiliza porque pdftk no está en el path del sistema operativo.
                 * Si se usa windows hay que colorar el pdftk como variable global, ya que el proceso se ejecuta por consola.
                 * 
                 */
                passthru("/usr/local/bin/pdftk $pdf_file fill_form $fdf_file output $path flatten");

                unlink($fdf_file);


                echo $cedula . ' -> OK</br>';
                
            }
            
        }
        
    }

    private function setComprobante($cedula) {

        $datosGenerales = $this->model->admisiones->GetDatosGenerales($cedula);
        if (!empty($datosGenerales)) {


            Loader::using("models::entities::Interesados");
            $interesado = new Interesados();

            $interesadoPk = new InteresadoPk();
            $identificacion = new Identificacion();
            $identificacion->setNumeroDocumentoIdentidad($datosGenerales[0]['DocumentoIdentidad']);
            $identificacion->setTipoDocumentoIdentidad($datosGenerales[0]['TipoDocumento']);
            $interesadoPk->setCodigoPlanEstudio($datosGenerales[0]['PlanEstudio']);
            $interesadoPk->setIdentificacion($identificacion);
            $periodoInscripcion = ModulesContext::instance()->getConfig()->get("periodoInscripcion");
        
            $periodoAcademico = new PeriodoAcademico();
            $periodoAcademico->setAno($periodoInscripcion["ano"]);
            $periodoAcademico->setPeriodo($periodoInscripcion["periodo"]);
            $interesadoPk->setPeriodoAcedemico($periodoAcademico);
            $interesado->setInteresadoPk($interesadoPk);

            $interesado->setApellidos($datosGenerales[0]['Apellido']);
            $interesado->setNombres($datosGenerales[0]['Nombre']);

            $interesado->setFechaNacimiento(MicrosoftDateFormatter::toJSON($datosGenerales[0]['FechaNacimiento']));

            $DatosContacto = new DatosContacto();
            $municipioResidencia = new Municipios();
            $municipioResidencia->setNombre($datosGenerales[0]['MunicipioResidencia']);
            $DatosContacto->setMunicipio($municipioResidencia);
            $DatosContacto->setDireccion($datosGenerales[0]['Direccion']);
            $DatosContacto->setTelefono($datosGenerales[0]['TelefonoFijo']);
            $interesado->setDatosContacto($DatosContacto);

            $interesado->setCelular($datosGenerales[0]['TelefonoMovil']);
            
            $PlanEstudio = $this->model->career->GetById($datosGenerales[0]['PlanEstudio']);
            $interesado->setPlanEstudio($PlanEstudio);

            $Pais = new Paises();
            $Pais->setNombre($datosGenerales[0]['PaisNacimiento']);
            $Departamento = new Departamentos();
            $Departamento->setPais($Pais);
            $Departamento->setNombre($datosGenerales[0]['DepartamentoNacimiento']);
            $Municipio = new Municipios();
            $Municipio->setNombre($datosGenerales[0]['MunicipioNacimiento']);
            $Municipio->setDepartamento($Departamento);
            $interesado->setCiudadNacimiento($Municipio);

            $interesado->setCodigoConcepto(10);
            if($PlanEstudio->getTipoPrograma() == 0 && $PlanEstudio->getTipoPrograma() == 5){
                $interesado->setDetalleConcepto(3);
            } else {
                if($PlanEstudio->getTipoPrograma() == 3){
                    $interesado->setDetalleConcepto(5);
                } else {
                    $interesado->setDetalleConcepto(4);
                }
            }
            
            /*
             * Codigo concepto:
             *  Inscripcion = 10
             * 
             * detalle concepto:
             *  pregrado = 3
             *  posgrados = 4
             *  educacion continua/ diplomado = 5
             */
            

            $interesado->setEmail($datosGenerales[0]['Email']);
            $interesado->setSexo($datosGenerales[0]['Sexo']);
            $interesado->setEstrato($datosGenerales[0]['Estrato']);
            $interesado->setTipoInscripcion($datosGenerales[0]['tipoInscripcion']);

            $reporte = $this->model->interested->Create($interesado);
            return true;
        } else {
            return false;
        }
    }
}
?>